package JVM.第03篇_运行时内存篇;

/**
 * 局部变量表(local variables)
 * ●局部变量表也被称之为局部变量数组或本地变量表
 * ●定义为一个数字数组，主要用于存储方法参数和定义在方法体内的局部变量，
 * 这些数据类型包括各类基木数据类型(8种)、对象引用(reference) ，
 * 以及returnAddress类型。
 * ●局部变量表所需的容量大小是在编译期确定下来的，
 * 并保存在方法的Code属性的maximum local variables数据项中。
 * 在方法运行期问是不会改变局部变量表的大小的。
 * ●方法嵌套调用的次数由栈的大小决定。一般来说，栈越大，方法嵌套调用次数越多。
 * 对一个函数而言，它的参数和局部变量越多，使得局部变量表膨胀，它的栈帧就越大，
 * 以满足方法调用所需传递的信息增大的需求。
 * 进而函数调用就会占用更多的栈空间导致其嵌套调用次数就会减少。
 * ●局部变量表中的变量只在当前方法调用中有效。
 * 在方法执行时，虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程。
 * 当方法调用结束后，随着方法栈帧的销毁，局部变量表也会随之销毁。
 *
 * 局部变量表与GC Roots的关系
 * 局部变量表中的变量也是重要的垃圾回收根节点，只要被局部变量表中直接或间接引用的对象都不会被回收。
 *
 */
public class C1_局部变量表 {

    /**
     *  如果是静态方法，局部变量表里只有内部的局部变量
     *  如果是普通方法，局部变量表就多1个    this   自己
     *  double和long会占用两个Slot(槽位)也就是两个 局部变量的数量
     */
    public void test4() {
        //this Slot 1
        int a = 0;//Slot 2
        {
            int b = 1;//Slot 3
            b = a+1;
        }
        int c = a+1;//Slot 3   复用了b的因为 b在{}外就空了，可以复用
    }

}
